/**
 * @author hhlxy
 * @version 1.0
 * @since 2025/8/5
 * 文章类型控制器类，负责处理与文章分类相关的HTTP请求
 */
package cn.yilongquan.controller;


import cn.yilongquan.authorize.PreAuthorize;
import cn.yilongquan.service.ArticleTypeService;
import cn.yilongquan.user.domain.ArticleType;
import cn.yilongquan.user.query.ArticleTypeQuery;
import cn.yilongquan.util.R;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.cache.CacheProperties;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;

import java.util.Date;
import java.util.List;

/**
 * 文章类型控制器，提供文章分类的增删改查及树形结构查询接口
 */
@Api(value = "articleType相关的接口", tags = "文章类型管理")
@RestController
@RequestMapping("/articleType")
public class ArticleTypeController {

    @Autowired
    private ArticleTypeService articleTypeService;

    /**
     * 根据ID查询指定文章类型信息
     * @param id 文章类型ID
     * @return 文章类型详情
     */
    @ApiOperation(value = "查询指定文章类型信息")
    @GetMapping("/id")
    @PreAuthorize(sn = "articleType:findById", name = "根据ID查询文章类型", descs = "根据ID查询指定文章类型的详细信息")
    public R findbyId(@PathVariable("id") Long id){
        return R.ok(articleTypeService.findById(id));
    }

    /**
     * 查询所有文章类型信息
     * @return 文章类型列表
     */
    @ApiOperation(value = "查询所有文章类型信息")
    @GetMapping
    @PreAuthorize(sn = "articleType:findAll", name = "查询所有文章类型", descs = "查询系统中所有的文章类型信息")
    public R findAll(){
        return R.ok(articleTypeService.findAll());
    }

    /**
     * 根据ID删除指定文章类型
     * @param id 文章类型ID
     * @return 操作结果
     */
    @ApiOperation(value = "删除指定文章类型信息")
    @DeleteMapping("/{id}")
    @PreAuthorize(sn = "articleType:deleteById", name = "根据ID删除文章类型", descs = "根据ID删除指定的文章类型")
    public R deletebyId(@PathVariable("id") Long id){
        articleTypeService.deleteById(id);
        return R.ok();
    }

    /**
     * 批量删除文章类型
     * @param ids 文章类型ID列表
     * @return 操作结果
     */
    @ApiOperation(value = "批量删除文章类型信息")
    @PostMapping("/deleteAll")
    @PreAuthorize(sn = "articleType:batchDelete", name = "批量删除文章类型", descs = "根据ID列表批量删除文章类型")
    public R batchDelete(@RequestBody List<Long> ids){
        articleTypeService.batchDelete(ids);
        return R.ok();
    }


    /**
     * 添加或修改文章类型
     * @param articleType 文章类型对象
     * @return 操作结果
     * 说明：当ID为空时执行新增操作，自动设置创建时间；
     * 当ID不为空时执行更新操作，需确保父类ID不等于自身ID，同时更新修改时间
     */
    @ApiOperation(value = "添加或修改文章类型信息")
    @PostMapping("/add")
    @PreAuthorize(sn = "articleType:addOrUpdate", name = "添加或修改文章类型", descs = "新增文章类型或更新已有文章类型信息")
    public R add(@RequestBody ArticleType articleType){
        if(articleType.getId() == null){
            articleType.setCreateTime(new Date());
            articleTypeService.add(articleType);
        }else {
            if(articleType.getId() != articleType.getParentId()){
                articleType.setUpdateTime(new Date());
                articleTypeService.update(articleType);
            }else{
                return R.fail("不能选择自己作为父类");
            }

        }
        return R.ok();
    }

    /**
     * 分页查询文章类型信息
     * @param articleTypeQuery 文章类型查询对象，包含分页参数和查询条件
     * @return 分页查询结果
     */
    @ApiOperation(value = "分页查询文章类型信息")
    @PostMapping("/list")
    @PreAuthorize(sn = "articleType:pageList", name = "分页查询文章类型", descs = "根据查询条件分页查询文章类型信息")
    public R pageList(@RequestBody ArticleTypeQuery articleTypeQuery){
        return R.ok(articleTypeService.pageList(articleTypeQuery));
    }

    /**
     * 获取文章类型树形结构
     * @return 树形结构的文章类型数据
     */
    @ApiOperation(value = "获取文章类型树形结构")
    @GetMapping("/getTree")
    @PreAuthorize(sn = "articleType:getTree", name = "获取文章类型树形结构", descs = "查询文章类型的树形结构数据")
    public R getTree(){
        return articleTypeService.getTree();
    }
}
